package com.hsurosy.hsuchain.nft.user.domain.service;

import com.hsurosy.hsuchain.nft.base.utils.HttpUtils;
import com.alibaba.fastjson2.JSON;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.util.EntityUtils;

import java.util.Map;

/**
 * 实名认证服务实现类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 19:01
 * @Description
 * @Version: v1.0.0
 */
@Slf4j
public class AuthServiceImpl implements AuthService {

    /**
     * 实名认证 API 的主机地址
     */
    private String host;

    /**
     * 实名认证 API 的请求路径
     */
    private String path;

    /**
     * API 授权码
     */
    private String appcode;

    /**
     * 响应结果中的认证状态字段
     */
    private static final String STATE = "state";

    /**
     * 构造方法，初始化实名认证服务的基本信息。
     *
     * @param host    实名认证 API 的主机地址
     * @param path    实名认证 API 的请求路径
     * @param appcode API 授权码
     */
    public AuthServiceImpl(String host, String path, String appcode) {
        this.host = host;
        this.path = path;
        this.appcode = appcode;
    }

    /**
     * 校验实名认证信息
     * <p>
     * 使用外部 API 校验用户提供的真实姓名和身份证号码，返回校验结果。
     * </p>
     *
     * @param realName 用户的真实姓名
     * @param idCard   用户的身份证号码
     * @return boolean 校验通过返回 true，失败返回 false
     */
    @Override
    public boolean checkAuth(String realName, String idCard) {
        // 定义请求方法为 POST
        String method = "POST";

        // 构建请求头
        Map<String, String> headers = Maps.newHashMapWithExpectedSize(2);
        headers.put("Authorization", "APPCODE " + appcode);
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

        // 构建请求体
        Map<String, String> bodys = Maps.newHashMapWithExpectedSize(2);
        bodys.put("id_number", idCard);
        bodys.put("name", realName);

        try {
            // 发送 HTTP 请求，调用实名认证 API
            var response = HttpUtils.doPost(host, path, method, headers, null, bodys);

            // 解析响应结果
            Map<String, Object> resultMap = JSON.parseObject(EntityUtils.toString(response.getEntity()), Map.class);
            log.info("auth result : " + resultMap);

            // 判断认证结果的状态
            if ((Integer) resultMap.get(STATE) == 1) {
                return true;
            }
        } catch (Exception e) {
            // 异常处理，打印错误日志
            log.error("checkAuth error realName=" + realName, e);
        }
        // 校验失败，返回 false
        return false;
    }
}
